// UserInteractionManager.h
//
#ifndef USERINTERACTIONMANAGER_H
#define USERINTERACTIONMANAGER_H

#include <QMap>
#include <QAction>
#include <QString>
#include <QObject>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsSceneWheelEvent>

namespace IDS{
namespace IDEAS{
namespace OpenGLView{
namespace Fwk{

////////////////////////////////////////////////////////////////////////////////////////////////////
// @brief	Manager for user interactions. 
//
// @author	D.vacca
// @date	13/05/2010
////////////////////////////////////////////////////////////////////////////////////////////////////
class UserInteractionManager : public QObject
{
	Q_OBJECT

private:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Default constructor (private)
	//
	// @author	D.vacca
	// @date	13/05/2010
	////////////////////////////////////////////////////////////////////////////////////////////////////
	//UserInteractionManager();
	//static UserInteractionManager *instance;


	typedef QMap<QString,QAction *>  KeyBinds;		// action list
	typedef QMap<QString,QString>    MouseBinds;	// map string->ActionName

	KeyBinds	keyBindings;
	MouseBinds	mouseBindings;

public:
	void clear();

	UserInteractionManager();

	//static UserInteractionManager *getInstance();
	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Finaliser. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	////////////////////////////////////////////////////////////////////////////////////////////////////
	~UserInteractionManager();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Adds a key binding. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @param	name				The name. 
	// @param	shortcut			The shortcut. 
	// @param [in,out]	receiver	If non-null, the receiver. 
	// @param	method				The method. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void addKeyBinding(const QString &name, const QString &Text, const QString &shortcut, QObject *receiver, const char *method );

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Gets the key bindings. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @return	empty list if it fails, else the key bindings. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QList<QAction *> getKeyBindings();

	QAction* getAction(const QString &name);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Adds a mouse binding to 'shortcut'. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @param	name		The name. 
	// @param	shortcut	The shortcut. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void addMouseBinding(const QString &name, const QString &shortcut);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Gets a mouse action. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @param [in,out]	e	If non-null, the. 
	//
	// @return	The mouse action. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QString getMouseAction( QGraphicsSceneWheelEvent *e );

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Gets a mouse action. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @param [in,out]	e	If non-null, the. 
	//
	// @return	The mouse action. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QString getMouseAction( QWheelEvent *e );


	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Gets a mouse action. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @param [in,out]	e	If non-null, the. 
	//
	// @return	The mouse action. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QString getMouseAction( QGraphicsSceneMouseEvent *e );

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// @brief	Gets a mouse action. 
	//
	// @author	D.vacca
	// @date	13/05/2010
	//
	// @param [in,out]	e	If non-null, the. 
	//
	// @return	The mouse action. 
	////////////////////////////////////////////////////////////////////////////////////////////////////
	QString getMouseAction( QMouseEvent *e );
};


}}}}

#endif

//#define UIM (*IDS::IDEAS::OpenGLView::Fwk::UserInteractionManager::getInstance())


